let THREE=require('three');
import CONST from './collision-const';

/**
 * 碰撞事件生成
 */
export default class CollisionDispatcher extends THREE.EventDispatcher{
    constructor(){
        super();
        this._init();
    }

    /**
     * 开启或关闭事件发送
     * @param bol
     */
    set active(bol){
        this._active=bol;
    }

    /**
     * 发送碰撞进入事件
     * e.paras.collider:碰撞体
     * e.paras.rigid:刚体
     * e.paras.object:3D对象
     * @param collider
     */
    dispatchContactEnter(collider){
        if(!this._active)return;
        this._contactEnterEvent.paras.collider=collider;
        this._contactEnterEvent.paras.rigid=collider.parent;
        this._contactEnterEvent.paras.object=collider.parent.parent;
        this.dispatchEvent(this._contactEnterEvent);
    }

    /**
     * 发送碰撞中事件
     * e.paras.collider:碰撞体
     * e.paras.rigid:刚体
     * e.paras.object:3D对象
     * @param collider
     */
    dispatchContactStay(collider){
        if(!this._active)return;
        this._contactStayEvent.paras.collider=collider;
        this._contactStayEvent.paras.rigid=collider.parent;
        this._contactStayEvent.paras.object=collider.parent.parent;
        this.dispatchEvent(this._contactStayEvent);
    }

    /**
     * 发送碰撞退出事件
     * e.paras.collider:碰撞体
     * e.paras.rigid:刚体
     * e.paras.object:3D对象
     * @param collider
     */
    dispatchContactExit(collider){
        if(!this._active)return;
        this._contactExitEvent.paras.collider=collider;
        this._contactExitEvent.paras.rigid=collider.parent;
        this._contactExitEvent.paras.object=collider.parent.parent;
        this.dispatchEvent(this._contactExitEvent);
    }

    /**
     * 添加碰撞进入事件句柄
     * @param func
     */
    addContactEnterListener(func){
        if(this.hasEventListener(CONST.EVENT_TYPE_CONTACT_STATE_ENTER,func))return;
        this.addEventListener(CONST.EVENT_TYPE_CONTACT_STATE_ENTER,func);
    }

    /**
     * 添加碰撞中事件句柄
     * @param func
     */
    addContactStayListener(func){
        if(this.hasEventListener(CONST.EVENT_TYPE_CONTACT_STATE_STAY,func))return;
        this.addEventListener(CONST.EVENT_TYPE_CONTACT_STATE_STAY,func);
    }

    /**
     * 添加碰撞退出事件句柄
     * @param func
     */
    addContactExitListener(func){
        if(this.hasEventListener(CONST.EVENT_TYPE_CONTACT_STATE_EXIT,func))return;
        this.addEventListener(CONST.EVENT_TYPE_CONTACT_STATE_EXIT,func);
    }

    /**
     * 移除碰撞进入事件句柄
     * @param func
     */
    removeContactEnterListener(func){
        if(!this.hasEventListener(CONST.EVENT_TYPE_CONTACT_STATE_ENTER,func))return;
        this.removeEventListener(CONST.EVENT_TYPE_CONTACT_STATE_ENTER,func);
    }

    /**
     * 移除碰撞中事件句柄
     * @param func
     */
    removeContactStayListener(func){
        if(!this.hasEventListener(CONST.EVENT_TYPE_CONTACT_STATE_STAY,func))return;
        this.removeEventListener(CONST.EVENT_TYPE_CONTACT_STATE_STAY,func);
    }

    /**
     * 移除碰撞退出事件句柄
     * @param func
     */
    removeContactExitListener(func){
        if(!this.hasEventListener(CONST.EVENT_TYPE_CONTACT_STATE_EXIT,func))return;
        this.removeEventListener(CONST.EVENT_TYPE_CONTACT_STATE_EXIT,func);
    }

    _init(){
        this._initVariable();
    }
    _initVariable(){
        this._active=true;
        this._contactEnterEvent={type:CONST.EVENT_TYPE_CONTACT_STATE_ENTER,paras:{collider:null,rigid:null,object:null}};
        this._contactStayEvent={type:CONST.EVENT_TYPE_CONTACT_STATE_STAY,paras:{collider:null,rigid:null,object:null}};
        this._contactExitEvent={type:CONST.EVENT_TYPE_CONTACT_STATE_EXIT,paras:{collider:null,rigid:null,object:null}};
    }
}